// Στο παρόν module περιέχονται δομές και functions που αφορούν στην αναζήτηση
// παικτών από την πλευρά του client. Τα κριτήρια αναζήτησης είναι τα εξής:
//
//	Όνομα		Πρόκειται για input field στο οποίο ο χρήστης συμπληρώνει
//			μέρος του login name, ή του ονόματος ενός παίκτη.
//
//	Μπλε μπίλια	Όταν έχουμε την μπλε μπίλια, η αναζήτηση αφορά σε όλους τους
//			παίκτες ανεξαρτήτως κατάστασης, δηλαδή αναζητώνται παίκτες
//			είτε είναι online, είτε όχι.
//
//	Πορτοκαλί μπίλια
//			Όταν έχουμε πορτοκαλί μπίλια, η αναζήτηση αφορά στους online
//			παίκτες, είτε παίζουν σε κάποιο τραπέζι, είτε είναι θεατές,
//			είτε είναι περιφερόμενοι.
//
//	Πράσινη μπίλια	Όταν έχουμε πράσινη μπίλια, η αναζήτηση αφορά μόνο σε παίκτες
//			που φαίνονται να μην μετέχουν ως παίκτες σε κάποιο τραπέζι.
//			Εδώ υπάρχει ένα μικρό πρόβλημα, καθώς κάποιος παίκτης που είναι
//			μεν παίκτης σε κάποιο τραπέζι, αλλά την ώρα της αναζήτησης είναι
//			θεατής σε κάποιο άλλο τραπέζι, εμφανίζεται ως ελεύθερος δηλαδή
//			ότι είναι διαθέσιμος για παιχνίδι.
//
//	Σχετιζόμενοι	Αν είναι εμφανές το ανθρωπάκι με τη χρυσή ζώνη, η αναζήτηση
//			αφορά στους παίκτες που σχετίζονται είτε ως φίλοι, είτε ως
//			αποκλεισμένοι, με τον παίκτη που εκτελεί την αναζήτηση. Αν
//			το ανθρωπάκι είναι αχνό, τότε η αναζήτηση αφορά σε όλους τους
//			παίκτες και όχι μόνο στους σχετιζόμενους.
//
// Αν ο χρήστης κάνει κλικ στο μεγεθυντικό φακό, τότε έχουμε άμεση αναζήτηση, αλλά
// έχουμε και αυτόματη αναζήτηση κατά τη διάρκεια της πληκτρολόγησης των ονομάτων.

Prefadoros.anazitisi = {
	// Ακολουθεί η επιθυμητή κατάσταση των αναζητουμένων παικτών.
	// By default η αναζήτηση αφορά σε όλους τους παίκτες, ανεξαρτήτως
	// κατάστασης.

	katastasi: 'ALL',	// μπλε μπίλια

	// Ακολουθεί το κριτήριο αναζήτησης που αφορά στους σχετιζόμενους παίκτες.
	// By default η αναζήτηση αφορά σε όλους τους παίκτες και όχι μόνο στους
	// στους σχετιζόμενους με τον παίκτη που εκτελεί την αναζήτηση.

	sxetikos: 0,		// αχνό ανθρωπάκι με χρυσή ζώνη

	// Το property "kritiria" περιέχει όλα τα κριτήρια τής τελευταίας
	// αναζήτησης που έχει εκτελέσει ο παίκτης. Πρόκειται για ένα ενιαίο
	// string και αν ζητηθεί νέα αναζήτηση με τα ίδια κριτήρια, δεν
	// εκτελείται εκ νέου αναζήτηση. Τυχόν αλλαγές που συμβαίνουν στην
	// πορεία και αφορούν στην κατάσταση των παικτών κλπ, ενημερώνουν
	// αυτόματα τη λίστα των αποτελεσμάτων.

	kritiria: null,

	// Το property "onomaRE" περιέχει regular expression που βοηθά στην
	// αναζήτηση με το όνομα ή το login name. Το "onomaRE" υπολογίζεται
	// κάθε φορά που αλλάζουμε τα κριτήρια αναζήτησης.

	onomaRE: null,
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η κλάση "Anazitisi" απεικονίζει τα αποτελέσματα των αναζητήσεων που αφορούν
// στους παίκτες. Πράγματι, τα αποτελέσματα παρίστανται από αντικείμενα που
// μπορούν να έχουν τα παρακάτω properties:
//
//	l:	Login name παίκτη.
//
//	o:	Όνομα παίκτη.
//
// Ο λόγος που δεν αναφερόμαστε στον πίνακα των παικτών είναι ότι μέσα στα
// αποτελέσματα των αναζητήσεων μπορούν να εμφανίζονται και παίκτες εκτός
// σκηνικού.

Anazitisi = function(anazitisi) {
	for (var i in anazitisi) this[i] = anazitisi[i];
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος match εφαρμόζεται σε αντικείμενα αναζήτησης και ελέγχει αν
// ταιριάζουν με τα κριτήρια που έχουμε δώσει.

Anazitisi.prototype.match = function() {
	if (!this.hasOwnProperty('l')) globals.fatal('Anazitisi.match: missing "l" property');
	if (!this.hasOwnProperty('o')) globals.fatal('Anazitisi.match: missing "o" property');

	// Αν δεν έχουν καθοριστεί κριτήρια, δεν επιλέγουμε κανέναν παίκτη.

	if (Prefadoros.anazitisi.kritiria == null) return false;

	// Ελέγχουμε αν το ανά χείρας αντικείμενο αναζήτησης συμφωνεί με τα
	// κριτήρια αναζήτησης που έχουμε καθορίσει.

	if (!this.matchOnoma()) return false;
	if (!this.matchKatastasi()) return false;
	if (!this.matchSxetikos()) return false;

	// Όλα τα κριτήρια που έχουν δοθεί συμφωνούν, επομένως το ανά χείρας
	// αντικείμενο αναζήτησης συμφωνεί με την αναζήτησή μας.

	return true;
}

Anazitisi.prototype.matchOnoma = function() {
	if (!Prefadoros.anazitisi.onomaRE) return true;
	if (this.l.match(Prefadoros.anazitisi.onomaRE)) return true;
	if (this.o.match(Prefadoros.anazitisi.onomaRE)) return true;
	return false;
}

Anazitisi.prototype.matchKatastasi = function() {
	if (Prefadoros.anazitisi.katastasi == 'ALL') return true;

	var sinedria = Skiniko.isSinedria(this.l);
	if (!sinedria) return false;

	if (Prefadoros.anazitisi.katastasi == 'ONLINE') return true;
	return sinedria.oxiPektis();
}

Anazitisi.prototype.matchSxetikos = function() {
	if (!Prefadoros.anazitisi.sxetikos) return true;
	return Prefadoros.ego.pektis.sxesi.hasOwnProperty(this.l);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "anazitisiDOM" δημιουργεί DOM element για το ανά χείρας
// αντικείμενο αναζήτησης και επιστρέφει το DOM element.

Anazitisi.prototype.anazitisiDOM = function() {
	var login, onoma, panel, p;

	if (!this.hasOwnProperty('l')) globals.fatal('Anazitisi.anazitisiDOM: missing "l" property');
	if (!this.hasOwnProperty('o')) globals.fatal('Anazitisi.anazitisiDOM: missing "o" property');

	login = this.l;
	onoma = this.o;

	// Ξεκινάμε από το πάνελ που συνοδεύει τα αντικείμενα αναζήτησης.

	panel = $('<div>').addClass('anazitisiPanel').

	append($('<img>').addClass('anazitisiIconFilos').attr({
		src: 'images/misc/filos.png',
		title: 'Ένταξη στους φίλους',
	}).on('click', function(e) {
		Pektis.iconAction.filos(e, $(this), login);
	})).

	append($('<img>').addClass('anazitisiIconApoklismos').attr({
		src: 'images/misc/apoklismos.png',
		title: 'Αποκλεισμός',
	}).on('click', function(e) {
		Pektis.iconAction.apoklismos(e, $(this), login);
	})).

	append($('<img>').addClass('anazitisiIconAsxetos').attr({
		src: 'images/misc/Xgreen.png',
		title: 'Αποσυσχέτιση',
	}).on('click', function(e) {
		Pektis.iconAction.aposisxetisi(e, $(this), login);
	})).

	append($('<img>').addClass('anazitisiIconProfinfo').attr({
		src: 'images/misc/profinfo.png',
		title: 'Προφίλ, πρόσκληση κλπ',
	}).on('click', function(e) {
		Pektis.profinfo(e, this, login);
	})).

	append($('<img>').addClass('anazitisiIconPermes').attr({
		src: 'images/misc/permes.png',
	})).

	append($('<img>').addClass('anazitisiIconIplocator').attr({
		src: 'images/misc/iplocator.png',
		title: 'Εντοπισμός IP',
	}).on('click', function(e) {
		Pektis.iconAction.iplocator(e, $(this), login);
	}));

	panel.find('img').addClass('anazitisiIcon');

	// Μετά το micorpanel ακολουθεί η περιοχή τού ονόματος. Εκεί μπορούμε να
	// κάνουμε κλικ για να αποστείλουμε πρόσκληση στον ανά χείρας παίκτη.

	onoma = $('<div style="display: inline;"><div class="anazitisiOnoma">' + this.o + '</div> ' +
		'[ <div class="anazitisiLogin">' + login + '</div> ]</div>').
	on('click', function(e) {
		Prosklisi.apostoli(e, login);
	});

	// Τώρα κατασκευάζουμε το DOM element με id τής μορφής "AZxxxxxx" όπου "xxxxxx"
	// είναι το login name του σχετικού παίκτη.

	p = $('<div id="AZ' + this.l + '" class="anazitisi"></div>').
	append('<img class="anazitisiIcon anazitisiIconBall" src="images/pss/blueBall.png" />').
	append(panel).
	append(onoma);

	// Επιστρέφουμε το DOM element εμπλουτισμένο με τις σχετικές μεθόδους
	// και διαμορφωμένο σύμφωνα με τα τρέχοντα στοιχεία του σχετικού παίκτη
	// και τυχόν σχετικής συνεδρίας.

	return $(p).anazitisiFixDOM(this);
}

// Η jQuery μέθοδος "anazitisiFixDOM" εφαρμόζεται σε jQuery λίστες DOM αντικειμένων
// αναζήτησης και διαμορφώνει τις σχετικές μεθόδους και στιλ σύμφωνα με τα στοιχεία
// τού σχετικού παίκτη και τυχόν σχετικής συνεδρίας.

jQuery.fn.anazitisiFixDOM = function(anazitisi) {
	if (!anazitisi.hasOwnProperty('l')) globals.fatal('Anazitisi.anazitisiDOM: missing "l" property');
	if (!anazitisi.hasOwnProperty('o')) globals.fatal('Anazitisi.anazitisiDOM: missing "o" property');

	return this.each(function() {
		$(this).anazitisiOnlineFixDOM(anazitisi.l);
		$(this).anazitisiSxesiFixDOM(anazitisi.l);
		$(this).find('.anazitisiOnoma').text(anazitisi.o);
		$(this).find('.anazitisiIconIplocator').css({
			display: Prefadoros.ego.pektis.isEpoptis() ? 'inline' : 'none'
		});
	});
}

jQuery.fn.anazitisiOnlineFixDOM = function(login) {
	return this.each(function() {
		var sinedria = Skiniko.isSinedria(login);
		if (!sinedria) {
			$(this).find('.anazitisiIconBall').attr({src: 'images/pss/blueBall.png'});
			$(this).find('.anazitisiLogin').addClass('anazitisiOffline');
		}
		else {
			$(this).find('.anazitisiLogin').removeClass('anazitisiOffline');
			if (sinedria.isPektis()) $(this).find('.anazitisiIconBall').attr({src: 'images/pss/orangeBall.png'});
			else $(this).find('.anazitisiIconBall').attr({src: 'images/pss/greenBall.png'});
		}
	});
}

jQuery.fn.anazitisiSxesiFixDOM = function(login) {
	return this.each(function() {
		if (Prefadoros.ego.pektis.isFilos(login)) {
			$(this).find('.anazitisiLogin').removeClass('apoklismenos').addClass('filos');
			$(this).find('.anazitisiIconApoklismos,.anazitisiIconAsxetos').css({display: 'inline'});
			$(this).find('.anazitisiIconFilos').css({display: 'none'});
		}
		else if (Prefadoros.ego.pektis.isApoklismenos(login)) {
			$(this).find('.anazitisiLogin').removeClass('filos').addClass('apoklismenos');
			$(this).find('.anazitisiIconFilos,.anazitisiIconAsxetos').css({display: 'inline'});
			$(this).find('.anazitisiIconApoklismos').css({display: 'none'});
		}
		else {
			$(this).find('.anazitisiLogin').removeClass('filos apoklismenos');
			$(this).find('.anazitisiIconFilos,.anazitisiIconApoklismos').css({display: 'inline'});
			$(this).find('.anazitisiIconAsxetos').css({display: 'none'});
		}
	});
}

// Η μέθοδος "sinedriaAnazitisiJQL" επιστρέφει jQuery element list για τα DOM elements
// αποτελεσμάτων αναζήτησης που αφορούν στον σχετικό παίκτη.

Sinedria.prototype.sinedriaAnazitisiJQL = function() {
	return Pektis.anazitisiJQL(this.pektis);
}

// Η μέθοδος "pektisAnazitisi" επιστρέφει αντικείμενο αναζήτησης που αφορά τον
// ανά χείρας παίκτη.

Pektis.prototype.anazitisi = function() {
	return new Anazitisi({
		l: this.login,
		o: this.onoma,
	});
}

Pektis.prototype.pektisAnazitisiJQL = function() {
	return Pektis.anazitisiJQL(this.login);
}

// Η μέθοδος "anazitisiMatchOnoma" επιστρέφει true αν ο ανά χείρας παίκτης
// πληροί το κριτήριο αναζήτησης ονόματος, αλλιώς επιστρέφει false.

Pektis.prototype.anazitisiMatchOnoma = function() {
	// Αν δεν υπάρχει κριτήριο ονόματος έχουμε αποτυχία.
	if (Prefadoros.anazitisi.onomaRE === null) return false;

	// Ελέγχεται το login name και το όνομα του παίκτη.
	if (this.login.match(Prefadoros.anazitisi.onomaRE)) return true;
	return this.onoma.match(Prefadoros.anazitisi.onomaRE);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η function "krtiriaCalc" συνδυάζει τα κριτήρια της αναζήτησης σε ένα ενιαίο
// string που περιέχει το όνομα, την κατάσταση και τη σχετικότητα χωρισμένα με
// ":", π.χ. αν έχουμε δώσει στο πεδίο του ονόματος "agra", κατάσταση "διαθέσιμος"
// και επιθυμούμε μόνο σχετικού παίκτες, η function θα επιστρέψει:
//
//	agra:AVAILABLE:1
//
// ενώ αν έχουμε αφήσει κενό το πεδίο του ονόματος, κατάσταση online και επιθυμούμε
// μόνο σχετικούς παίκτες:
//
//	:ONLINE:1
//
// Σε περίπτωση που δεν έχουμε δώσει κάποιο κριτήριο, δηλαδή όταν το υπολογιζόμενο
// string είναι ":ALL:0", επιστρέφεται null.

Prefadoros.anazitisi.kritiriaCalc = function(onoma) {
	var kritiria = onoma + ':' + Prefadoros.anazitisi.katastasi + ':' + Prefadoros.anazitisi.sxetikos;
	return(kritiria === ':ALL:0' ? null : kritiria);
}

// Η function "tora" είναι αυτή που εκτελεί τελικά την αναζήτηση, με όποιον τρόπο
// αυτή εκκινήσει. Ως πρώτη παράμετρο δέχεται το κλικ mouse event, ενώ ως δεύτερη
// παράμετρο περνάμε το εικονίδιο στο οποίο κάνουμε κλικ για να εκκινήσουμε την
// αναζήτηση. Αν η αναζήτηση εκτελείται αυτόματα μέσω της πληκτρολόγησης ονομάτων,
// τότε ως εικονίδιο λογίζεται ο μεθυντικός φακός, ενώ το mouse event είναι το
// keyup event του πλήκτρου που πατήθηκε.

Prefadoros.anazitisi.tora = function(e, ico) {
	var fld, onoma, kritiria, src;

	Client.stopProp(e);
	Prefadoros.input.apiko();

	// Ελέγχουμε τα κριτήρια και αν αυτά βρεθούν ίδια με τα κριτήρια τής
	// τελευταίας αναζήτησης, δεν εκτελούμε καμία περαιτέρω ενέργεια, καθώς
	// τα αποτελέσματα είναι ήδη στο DOM.

	fld = $('#anazitisiInput');
	onoma = fld.val().trim().replace(/%+/g, '%');
	if ((onoma == '%') || (onoma == '% %')) onoma = '';

	kritiria = Prefadoros.anazitisi.kritiriaCalc(onoma);
	if (kritiria === Prefadoros.anazitisi.kritiria) return;

	// Τα κριτήρια είναι διαφορετικά και Θα εκτελεστεί νέα αναζήτηση. Αρχικά
	// καθαρίζουμε την περιοχή των αποτελεσμάτων.

	Prefadoros.anazitisi.kritiria = kritiria;

	// Αν δεν έχουμε καθορίσει κανένα κριτήριο, τότε δεν εκτελούμε καμιά
	// αναζήτηση.

	if (Prefadoros.anazitisi.kritiria === null) {
		$('#sxesiArea').empty();
		$('.pektisOnoma').removeClass('trapeziPektisAnazitisi');
		return;
	}

	// Έχουν καθοριστεί κριτήρια αναζήτησης και Θα εκτελεστεί η σχετική αναζήτηση.
	// Θέτουμε το εικονίδιο εκκίνησης της αναζήτησης σε working mode και επιλέγουμε
	// τον τρόπο με τον οποίο θα αναζητήσουμε τα δεδομένα.

	if (!ico) ico = document.getElementById('anazitisiToraIcon');
	src = $(ico).attr('src');
	$(ico).working();

	// Οι μεταχαρακτήρες που αφορούν σε αναζητήσεις στην database θα πρέπει
	// να αλλάξουν όσον αφορά στον έλεγχο ονομάτων που θα γίνει με τη μέθοδο
	// "match" της javascript.

	Prefadoros.anazitisi.onomaRE = onoma ?
		new RegExp(onoma.replace(/_/g, '.').replace(/\%/g, '.*'), "i")
	:
		null;

	// Αν η κατάσταση αφορά σε online παίκτες, τότε μπορούμε να εκτελέσουμε
	// την αναζήτηση στο τοπικό σκηνικό, καθώς όλοι οι ενεργοί παίκτες
	// βρίσκονται ήδη στο σκηνικό, αλλιώς θα πρέπει να καταφύγουμε στην
	// database.

	if (Prefadoros.anazitisi.katastasi != 'ALL') Prefadoros.anazitisi.skiniko(onoma, ico, src);
	else Prefadoros.anazitisi.database(onoma, ico, src);
}

// Η function "skiniko" εκτελεί την αναζήτηση τοπικά και χρησιμοποιείται στην
// περίπτωση που αναζητούμε online παίκτες, είτε ελεύθερους, είτε παίζοντες.

Prefadoros.anazitisi.skiniko = function(onoma, ico, src) {
	var sxesi, alist, login, pektis, sinedria, p;

	// θα χρειαστούμε τους σχετιζόμενους παίκτες οπότε κρατάμε
	// πρόχειρη τη λίστα των σχετιζομένων του αιτούντος:

	sxesi = Prefadoros.ego.pektis.sxesi;

	alist = [];
	for (login in Skiniko.sinedria) {
		pektis = Skiniko.fetchPektis(login);
		if (!pektis.anazitisiMatchOnoma()) continue;

		sinedria = Skiniko.isSinedria(login);
		if (!sinedria) continue;	// μόλις έληξε η συνεδρία

		if ((Prefadoros.anazitisi.katastasi == 'AVAILABLE') && sinedria.isPektis()) continue;
		if (Prefadoros.anazitisi.sxetikos && (!Prefadoros.ego.pektis.sxesi.hasOwnProperty(login))) continue;

		p = new Anazitisi({
			l: login,
			o: pektis.onoma,
		});

		// Εισάγουμε στο αντικείμενο αναζήτησης ΚΑΙ τυχόν σχέση τού παίκτη
		// προκειμένου να διευκολύνουμε την ταξινόμηση, και κατόπιν προσθέτουμε
		// το αντικείμενο στα αποτελέσματα.

		if (Prefadoros.ego.pektis.sxesi.hasOwnProperty(login)) p.x = Prefadoros.ego.pektis.sxesi[login]['sxesi'];
		alist.push(p);
	}

	// Ταξινομούμε τη λίστα των αντικειμένων αναζήτησης που επιλέξαμε και
	// την περνάμε στην "updateDOM" ώστε να εμφανιστούν τα αποτελέμστα στην
	// περιοχή αποτελεσμάτων.

	Prefadoros.anazitisi.updateDOM(alist.sort(function(p1, p2) {
		var l1 = p1.l.toString(),
			l2 = p2.l.toString();

		// Οι φίλοι εμφανίζονται πρώτοι.

		if (p1.x == 'F') {
			if (p2.x != 'F') return -1;
			return l1.localeCompare(l2);
		}

		// Ακολουθούν όσοι δεν σχετίζονται με τον παίκτη που
		// εκτελεί την αναζήτηση.

		if (p1.x != 'B') {
			if (p2.x == 'F') return 1;
			if (p2.x == 'B') return 1;
			return l1.localeCompare(l2);
		}

		// Τελευταίοι εμφανίζονται οι αποκλεισμένοι.

		if (p2.x != 'F') return 1;
		return l1.localeCompare(l2);
	}));

	// Έχουν ενταχθεί στο DOM τα αποτελέσματα τής αναζήτησης και
	// επαναφέρουμε το εικονίδιο εκκίνησης στην αρχικη του εικόνα.

	$(ico).attr({'src': src});
}

// Η function "database" εκτελεί την αναζήτηση στον server. Αυτό είναι απαραίτητο
// στην περίπτωση που δεν έχει καθοριστεί κατάσταση "διαθέσιμος", ή "online" παίκτης,
// καθώς εκεί δεν έχουμε πρόχειρη λίστα παικτών στο σκηνικό και επομένως το μόνο μέρος
// στο οποίο μπορούμε να εντοπίσουμε τους παίκτες που αναζητούμε είναι η database.

Prefadoros.anazitisi.database = function(onoma, ico, src) {
	Client.node('anazitisi', 'onoma=' + onoma.uri(), 'sxetikos=' + Prefadoros.anazitisi.sxetikos,

	// Τα αποτελέσματα επιστρέφονται ως json αντικείμενα αναζήτησης χωρισμένα
	// με "," και είναι ήδη ταξινομημένα με τον τρόπο που πρέπει.

	function(rsp) {
		var i;
		$(ico).attr({'src': src});
		try {
			eval('var alist = [' + rsp + '];');
		} catch(e) {
			return Client.fyi.spano(rsp + ': λανθασμένα αποτελέσματα αναζήτησης');
		}

		if (alist.length >= Prefadoros.anazitisiMax) Client.fyi.
			pano('Για ακριβέστερα αποτελέσματα περιορίστε τα κριτήρια αναζήτησης');
		else Client.fyi.pano();

		// Μετατρέπουμε τώρα τα αντικείμενα του array των αποτελεσμάτων σε πραγματικά
		// αντικείμενα αναζήτησης, εμπλουτίζοντάς τα με τις σχετικές μεθόδους, και
		// προχωρούμε στην εμφάνισή τους στη σελίδα.

		for (i in alist) alist[i] = new Anazitisi(alist[i]);
		Prefadoros.anazitisi.updateDOM(alist);
	});
}

// Η function "updateDOM" δέχεται ως παράμετρο ένα array αντικειμένων αναζήτησης
// και τα εμφανίζει στην περιοχή των αποτελεσμάτων.

Prefadoros.anazitisi.updateDOM = function(alist) {
	var sa, i;

	sa = $('#sxesiArea').empty();
	for (i = 0; i < alist.length; i++) {
		sa.append(alist[i].anazitisiDOM());
	}
	sa.zevra();

	// Η ένδειξη των παικτών στο χώρο του καφενείου γίνεται μόνο
	// όταν έχουμε κριτήριο ονόματος και μάλιστα μεγαλούτσικο.

	$('.pektisOnoma').removeClass('trapeziPektisAnazitisi');
	if (Prefadoros.anazitisi.onomaRE === null) return;
	if ($('#anazitisiInput').val().length < 3) return;

	$('.pektisOnoma').each(function() {
		var login, pektis;

		login = $(this).text();
		if (!login) return;

		if (login.match(Prefadoros.anazitisi.onomaRE)) {
			$(this).addClass('trapeziPektisAnazitisi');
			return;
		}

		pektis = Skiniko.isPektis(login);
		if (!pektis) return;

		if (pektis.onoma.match(Prefadoros.anazitisi.onomaRE))
			$(this).addClass('trapeziPektisAnazitisi');
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η function "katastasiSet" θέτει το κριτήριο κατάστασης σε αυτό που περνάμε ως
// πρώτη παράμετρο:
//
//	ALL		Επιλέγονται παίκτες με βάση τα υπόλοιπα κριτήρια, ασχέτως
//			της κατάστασής τους.
//
//	ONLINE		Επιλέγονται όλοι οι online παίκτες ασχέτως αν είναι
//			διαθέσιμοι ή όχι.
//
//	AVAILABLE	Επιλέγονται οι παίκτες που είναι online και διαθέσιμοι.
//
// Αν δεν καθοριστεί κριτήριο κατάστασης, τότε τίθεται το default κριτήριο
// κατάστασης από τη σχετική λίστα. Μετά την αλλαγή του κριτηρίου τίθεται
// ανάλογα και το σχετικό εικονίδιο.

Prefadoros.anazitisi.katastasiSet = function(katastasi, ico) {
	var src, title;

	if (katastasi === undefined) katastasi = Prefadoros.anazitisi.katastasi;
	switch (katastasi) {
	case 'ONLINE':
		Prefadoros.anazitisi.katastasi = 'ONLINE';
		src = 'images/pss/orangeBall.png';
		title = 'Online παίκτες';
		break;
	case 'AVAILABLE':
		Prefadoros.anazitisi.katastasi = 'AVAILABLE';
		src = 'images/pss/greenBall.png';
		title = 'Online διαθέσιμοι παίκτες';
		break;
	default:
		Prefadoros.anazitisi.katastasi = 'ALL';
		src = 'images/pss/blueBall.png';
		title = 'Παίκτες ανεξαρτήτως κατάστασης';
		break;
	}

	if (!ico) ico = $('#anazitisiKatastasiIcon');
	return ico.attr({
		'src': src,
		'title': title,
	});
}

// Η function "sxetikosSet" θέτει το κριτήριο της σχετικότητας σε αυτό που
// περνάμε ως πρώτη παράμετρο:
//
//	1	Επιλέγονται μόνο συσχετισμένοι παίκτες.
//
//	0	Επιλέγονται παίκτες ασχέτως με το αν είναι συσχετισμένοι.
//
// Αν δεν καθοριστεί κριτήριο σχετικότητας, τότε τίθεται το default κριτήριο
// σχετικότητας από τη σχετική λίστα. Μετά την αλλαγή του κριτηρίου τίθεται
// ανάλογα και το σχετικό εικονίδιο.

Prefadoros.anazitisi.sxetikosSet = function(sxetikos, ico) {
	var src, title;

	if (sxetikos === undefined) sxetikos = Prefadoros.anazitisi.sxetikos;
	if (sxetikos) {
		Prefadoros.anazitisi.sxetikos = 1;
		src = 'images/pss/sxetikos.png';
		title = 'Μόνο σχετιζόμενοι παίκτες';
	}
	else {
		Prefadoros.anazitisi.sxetikos = 0;
		src = 'images/pss/sokitexs.png';
		title = 'Και μη σχετιζόμενοι παίκτες';
	}

	if (!ico) ico = $('#anazitisiSxetikosIcon');
	return ico.attr({
		'src': src,
		'title': title,
	});
}

// Η function "clear" καθαρίζει το όνομα από το πεδίο αναζήτησης ονομάτων και
// δρομολογεί άμεση "αναζήτηση" με όσα κριτήρια απομένουν.

Prefadoros.anazitisi.clear = function(e, ico) {
	$('#anazitisiInput').val('');
	Prefadoros.anazitisi.onomaRE = null;
	Prefadoros.anazitisi.tora(e, ico);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Ακολουθούν δομές και functions που σχετίζονται με την online αναζήτηση κατά
// την πληκτρολόγηση των ονομάτων. Πράγματι, κατά την πληκτρολόγηση ονομάτων
// στο πεδίο αναζήτησης, δρομολογούνται αυτόματα αναζητήσεις με κάποια χρονικά
// κριτήρια· όσο περισσότεροι χαρακτήρες έχουν πληκτρολογηθεί, τόσο γρηγορότερα
// εκτελείται η αναζήτηση.

Prefadoros.anazitisi.ckoTimer = null;

Prefadoros.anazitisi.cko = function(e, fld) {
	var l, t;

	e.stopPropagation();
	if (Prefadoros.anazitisi.ckoTimer) {
		clearTimeout(Prefadoros.anazitisi.ckoTimer);
		Prefadoros.anazitisi.ckoTimer = null;
	}

	switch (e.which) {
	case 13:
		return Prefadoros.anazitisi.tora(e);
	case 27:
		fld.val('');
		break;
	case 33:	// page up
	case 34:	// page down
	case 35:	// end key
	case 36:	// home key
	case 37:	// left arrow
	case 38:	// up arrow
	case 39:	// right arrow
	case 40:	// down arrow
		return;
	}

	l = fld.val().trim().length;
	if (l == 0) t = 100;
	else if (l < 2) t = 800;
	else if (l < 3) t = 500;
	else if (l < 5) t = 200;
	else t = 100;

	Prefadoros.anazitisi.ckoTimer = setTimeout(function() {
		Prefadoros.anazitisi.tora(e);
	}, t);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Ακολουθούν διαδικασίες αρχικοποίησης που αφορούν στην αναζήτηση. Εδώ
// εμφανίζονται τα σχετικά εικονίδια και εισάγονται οι event listeners
// που αφορούν στα κλικ των εικονιδίων αναζήτησης και στην πληκτρολόγηση
// των ονομάτων.

$(document).ready(function() {
	// Όταν κάνουμε κλικ στον μεγεθυντικό φακό, εκκινούμε άμεσα νέα
	// αναζήτηση.

	$('#anazitisiToraIcon').on('click', function(e) {
		e.stopPropagation();
		Prefadoros.anazitisi.tora(e, $(this));
	});

	// Όταν κάνουμε κλικ στο εικονίδιο κατάστασης αναζητουμένων παικτών,
	// αλλάζουμε την επιθυμητή κατάσταση κυκλικά από "ΟΛΟΙ", σε "ΔΙΑΘΕΣΙΜΟΙ",
	// σε "ONLINE" κοκ, και δρομολογούμε άμεσα αναζήτηση με τα νέα κριτήρια.

	Prefadoros.anazitisi.katastasiSet().on('click', function(e) {
		e.stopPropagation();
		switch (Prefadoros.anazitisi.katastasi) {
		case 'ALL': Prefadoros.anazitisi.katastasiSet('ONLINE', $(this)); break;
		case 'ONLINE': Prefadoros.anazitisi.katastasiSet('AVAILABLE', $(this)); break;
		default: Prefadoros.anazitisi.katastasiSet('ALL', $(this)); break;
		}
		Prefadoros.anazitisi.tora(e, $(this));
	});

	// Όταν κάνουμε κλικ στο εικονίδιο σχετικόττητας αναζητουμένων παικτών,
	// αλλάζουμε από "ΟΛΟΙ" σε "ΣΧΕΤΙΚΟΙ" κοκ, και δρομολογούμε άμεσα  αναζήτηση
	// με τα νέα κριτήρια.

	Prefadoros.anazitisi.sxetikosSet().on('click', function(e) {
		e.stopPropagation();
		if (Prefadoros.anazitisi.sxetikos) Prefadoros.anazitisi.sxetikosSet(0, $(this));
		else Prefadoros.anazitisi.sxetikosSet(1, $(this));
		Prefadoros.anazitisi.tora(e, $(this));
	});

	$('#anazitisiClearIcon').on('click', function(e) {
		e.stopPropagation();
		Prefadoros.anazitisi.clear(e, $(this));
		Prefadoros.anazitisi.tora(e, $(this));
	});

	$('#anazitisiInput').on('focus', function() {
		Prefadoros.input.set('anazitisiInput');
	}).on('keyup', function(e) {
		Prefadoros.anazitisi.cko(e, $(this));
	});

	// Τα αποτελέσματα της αναζήτησης εμφανίζουν στο αριστερό μέρος βούλα κατάστασης,
	// παρόμοια με τη βούλα των κριτηρίων αναζήτησης, που δείχνει την κατάσταση ενός
	// εκάστου αποτελέσματος. Αυτή η βούλα εξυπηρετεί, όμως, και άλλο σκοπό: κάνοντας
	// κλικ στη βούλα, εμφανίζεται/αποκρύπτεται micropanel με εικονίδια διαχείρισης
	// του παίκτη που αφορά το συγκεκριμένο αποτέλεσμα.

	$(document).on('click', '.anazitisiIconBall', function() {
		var p = $(this).parents('.anazitisi').find('.anazitisiPanel');
		if (p.length != 1) return;

		p.stop();
		if (p.css('maxWidth') == '0px') {
			$('.anazitisiPanel').css({maxWidth: '0px'});
			p.animate({maxWidth: '500px'}, 200, 'easeInCubic');
		}
		else
			p.animate({maxWidth: '0px'}, 200, 'easeOutCubic');
	});
});
